#ifndef __BSP_V4L2_H__
#define __BSP_V4L2_H__

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

typedef int32_t camera_id_t;

#define MAX_ERR_DEF                         13                                      // 最大数量错误定义

enum {
    err_unknown                             = -MAX_ERR_DEF,                         // 未知错误
    err_sys,                                                                        // 系统错误
    err_timeout,                                                                    // 处理超时
    err_out_of_ram,                                                                 // 缓冲存储空间不足
    err_mmap,                                                                       // 不支持内存映射
    err_no_stream,                                                                  // 不支持流式传输
    err_no_read_io,                                                                 // 不支持读io
    err_no_video,                                                                   // 无视频功能
    err_dev_ope,                                                                    // 设备操作错误
    err_sft_not_exist,                                                              // 无驱动
    err_open_dev,                                                                   // 打开设备失败
    err_dev_dir,                                                                    // 设备路径错误
    err_dev_not_exist,                                                              // 设备不存在
    err_none                                = 0,                                    // 无错误
};
typedef int32_t camera_error_t;
enum {
    cam_func_auto_focus                     = 0,                                    // 自动对焦
    cam_func_auto_WBT,                                                              // 自动白平衡
    cam_func_brightness,                                                            // 亮度
    cam_func_contrast,                                                              // 对比度
    cam_func_saturation,                                                            // 饱和度               
    cam_func_hue,                                                                   // 色度
    cam_func_gamma,                                                                 // 伽马值
    cam_func_WBT,                                                                   // 白平衡
    cam_func_sharpness,                                                             // 锐度
    cam_func_focus_absolute,                                                        // 焦距
    cam_func_zoom_absolute,                                                         // 缩放
    cam_func_max,                                                                   // 
};
typedef int32_t camera_func_t;
typedef enum {
    IO_METHOD_READ,
    // 只有 IO_METHOD_MMAP 能用，其他两个还没来得及改
    IO_METHOD_MMAP,
    IO_METHOD_USERPTR,
}io_method;

typedef struct {
    void *start;    // 缓冲区起始地址
    size_t length;  // 缓冲区长度
}cam_buf_t;

typedef struct {
    char               *sDevName;           // 设备名称(路径)
    char               *sPhotoDir;          // 照片保存路径

    camera_id_t         iCameraId;          // 相机ID(此处混用做文件ID)

    io_method           eIoMethod;          // 缓存方式
    uint8_t             bUseDefault:1;      // 是否使用默认参数
    uint8_t             bRe1:7;
    uint32_t            uWidth;             // 宽
    uint32_t            uHeight;            // 高
    uint32_t            uPixelFormat;       // 像素格式
     int32_t            iUseNum;            // 使用第几帧

    uint32_t            uBufNum;            // 实际分配的缓冲区数量
    cam_buf_t          *pBufs;              // 缓冲区
}v4l2_parm_t;

camera_error_t bsp_cam_open(v4l2_parm_t *ptData);
camera_error_t bsp_cam_init(v4l2_parm_t *ptData);
camera_error_t bsp_cam_get_all_parm_and_val(v4l2_parm_t *ptData);
camera_error_t bsp_cam_set_parm(v4l2_parm_t *ptData, camera_func_t tCamFunc, int32_t iVal);
camera_error_t bsp_cam_set_all_val(v4l2_parm_t *ptData);
camera_error_t bsp_cam_get_all_cur_val(v4l2_parm_t *ptData);
camera_error_t bsp_cam_start_capturing(v4l2_parm_t *ptData);
camera_error_t bsp_cam_mainloop(v4l2_parm_t *ptData);
camera_error_t bsp_cam_stop_capturing(v4l2_parm_t *ptData);
camera_error_t bsp_cam_uninit_camera(v4l2_parm_t *ptData);
camera_error_t bsp_cam_close_camera(v4l2_parm_t *ptData);

const char *bsp_cam_get_err_str(camera_error_t err_code);

#if !(err_dev_not_exist != -1)
#error "parm error"
#endif

#endif  // __BSP_V4L2_H__